package at.donalfonso.kunde;

import java.util.ArrayList;

import org.mozartspaces.capi3.ContainerNameNotAvailableException;
import org.mozartspaces.capi3.CountNotMetException;
import org.mozartspaces.core.Capi;
import org.mozartspaces.core.CapiUtil;
import org.mozartspaces.core.ContainerReference;
import org.mozartspaces.core.Entry;
import org.mozartspaces.core.MzsConstants.Container;
import org.mozartspaces.core.MzsConstants.RequestTimeout;
import org.mozartspaces.core.MzsCoreException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import at.donalfonso.model.LieferBestellung;
import at.donalfonso.model.LieferKunde;
import at.donalfonso.ui.group.GruppeThread;
import at.donalfonso.utility.SpaceUtility;

public class KundeThread extends GruppeThread {

	private LieferKunde kunde;
	
	private SpaceUtility space;
	private Capi capi, lieferCapi;
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	/**
	 * Der Kunde gibt die Bestellung auf und wartet auf die Pizza.
	 */
	public KundeThread(LieferKunde kunde) {
		super(kunde);
		// Filiale für SpaceUtility aus Kunden-Objekt
		space = new SpaceUtility(kunde.getFilialID());
		capi = space.getCapi();
		lieferCapi = space.getLieferCapi();
		this.kunde = kunde;
	}
	
	public void run() {
		
		try {
			// bei Pizzeria "anrufen"
			capi.write(space.getTelefonContainer(), new Entry(kunde)); 
			
			// auf Lieferung warten
			// wenn es bereits einen Container für unsere Adresse gibt, diesen verwenden
			ContainerReference addr = null;
			try {
				addr = lieferCapi.createContainer("kunde." + kunde.getAdresse(), space.getLieferUri(), Container.UNBOUNDED, null, null, null);
			} catch (ContainerNameNotAvailableException e) {
				addr = lieferCapi.lookupContainer("kunde." + kunde.getAdresse(), space.getLieferUri(), RequestTimeout.TRY_ONCE, null);
			}
			if (addr == null) {
				return;
			}
            ArrayList<LieferBestellung> ll = null;
            try {
            	ll = lieferCapi.take(addr);
            } catch (CountNotMetException e) {
            	return;
            }
			LieferBestellung lieferung = CapiUtil.getSingleEntry(ll);
            logger.info("Lieferung erhalten: " + lieferung);
		} catch (MzsCoreException e) {
			e.printStackTrace();
		}
		
	}

}
